home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 23
/
AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso
/
PublicDomain
/
Anwendungen
/
ImageManager
/
Examples
/
Filter.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-11-10
|
3KB
|
116 lines
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <proto/exec.h>
#include <proto/imagemanager.h>
#include <proto/intuition.h>
#ifndef REG
#define REG(x) register __ ## x
#endif
extern "C" kprintf (STRPTR, ...);
struct Library *ImageManagerBase;
struct InstanceData { ULONG Height; ULONG *Buffer; };
ULONG Dispatcher (REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
{
ULONG result = FALSE;
struct InstanceData *data = (InstanceData *)INST_DATA(cl, obj);
switch(msg->MethodID)
{
case IMM_NewFrame:
{
if(result = DoSuperMethodA(cl, obj, msg))
data->Height = ((IMP_NewFrame *)msg)->Height;
}
break;
case IMM_ReceiveData:
{
struct IMP_ReceiveData *rmsg = (IMP_ReceiveData *)msg;
ULONG width = rmsg->Pixels.Width;
DOUBLE y_intensity = sin(((DOUBLE)rmsg->Pixels.Y) * PI / ((DOUBLE)data->Height));
UBYTE *rgba, *dst = rgba = (UBYTE *)rmsg->Pixels.RGBA;
if(rmsg->Pixels.Flags & IMF_ReceiveData_KeepIntact)
{
if(!data->Buffer)
data->Buffer = new ULONG [width];
if(!(dst = (UBYTE *)(rmsg->Pixels.RGBA = data->Buffer)))
break;
}
for(UWORD i = 0; i < width; i++)
{
DOUBLE intensity = y_intensity * sin(((DOUBLE)i) * PI / ((DOUBLE)width));
dst[4*i+0] = intensity * rgba[4*i+0];
dst[4*i+1] = intensity * rgba[4*i+1];
dst[4*i+2] = intensity * rgba[4*i+2];
}
result = DoSuperMethodA(cl, obj, msg);
}
break;
case OM_DISPOSE:
{
delete data->Buffer;
result = DoSuperMethodA(cl, obj, msg);
}
break;
default:
result = DoSuperMethodA(cl, obj, msg);
break;
}
return result;
}
int main (int argc, char **argv)
{
if(ImageManagerBase = OpenLibrary("ImageManager.library", 1))
{
struct IClass *myclass;
if(myclass = MakeClass(NULL, NULL, IM_GetClass("Link"), sizeof(InstanceData), 0L))
{
myclass->cl_Dispatcher.h_Entry = (HOOKFUNC)Dispatcher;
struct Window *win = OpenWindowTags(NULL, WA_Activate, TRUE, WA_IDCMP, IDCMP_CLOSEWINDOW, WA_CloseGadget, TRUE, WA_DragBar, TRUE, WA_DepthGadget, TRUE, TAG_DONE);
Object *file, *decoder, *spot, *container, *raster;
if(raster = IM_NewObject("Raster", IMA_Raster_RastPort, win->RPort, IMA_Raster_OffsetX, win->BorderLeft, IMA_Raster_OffsetY, win->BorderTop, TAG_DONE))
{
if(container = IM_NewObject("Container", IMA_Next, raster, IMA_Container_Screen, win->WScreen, TAG_DONE))
{
if(spot = (Object *)NewObject(myclass, NULL, IMA_Next, container, TAG_DONE))
{
if(decoder = IM_NewObject("Decoder", IMA_Next, spot, TAG_DONE))
{
if(file = IM_NewObject("File", IMA_Next, decoder, TAG_DONE))
{
DoMethod(file, IMM_File_Load, argc == 2 ? argv[1] : "Download:/«99.03.02»/001_ScrollBarGrab.PNG");
IM_DisposeObject(file);
}
IM_DisposeObject(decoder);
}
WaitPort(win->UserPort);
DisposeObject(spot);
}
IM_DisposeObject(container);
}
IM_DisposeObject(raster);
}
CloseWindow(win);
CloseLibrary(ImageManagerBase);
FreeClass(myclass);
}
}
return 0;
}